import { Viewer, ImageryLayer, ImageryProvider } from "cesium";

/**
 * LayerManager 类用于管理 Cesium 中的影像图层
 * 提供了图层的添加、删除、显示控制等功能
 * @class
 */
export class LayerManager {
  /** Cesium Viewer 实例 */
  private viewer: Viewer;
  /** 图层映射表，用于存储和管理所有图层 */
  private layers: Map<string, ImageryLayer> = new Map();

  /**
   * 创建 LayerManager 实例
   * @param {Viewer} viewer - Cesium Viewer 实例
   */
  constructor(viewer: Viewer) {
    this.viewer = viewer;
  }

  /**
   * 添加影像图层到场景中
   * @param {string} id - 图层的唯一标识符
   * @param {ImageryProvider} provider - 影像提供者
   * @param {number} [index] - 图层的索引位置，可选
   * @returns {ImageryLayer} 添加的图层
   */
  public addLayer(
    id: string,
    provider: ImageryProvider,
    index?: number
  ): ImageryLayer {
    const layer = new ImageryLayer(provider);
    this.viewer.imageryLayers.add(layer, index);
    this.layers.set(id, layer);
    return layer;
  }

  /**
   * 从场景中移除图层
   * @param {string} id - 要移除的图层的唯一标识符
   * @returns {boolean} 是否成功移除图层
   */
  public removeLayer(id: string): boolean {
    const layer = this.layers.get(id);
    if (layer) {
      this.viewer.imageryLayers.remove(layer);
      this.layers.delete(id);
      return true;
    }
    return false;
  }

  /**
   * 获取指定 ID 的图层
   * @param {string} id - 图层的唯一标识符
   * @returns {ImageryLayer | undefined} 找到的图层，如果不存在则返回 undefined
   */
  public getLayer(id: string): ImageryLayer | undefined {
    return this.layers.get(id);
  }

  /**
   * 设置图层的可见性
   * @param {string} id - 图层的唯一标识符
   * @param {boolean} visible - 是否显示图层
   * @returns {boolean} 是否成功设置图层可见性
   */
  public setLayerVisible(id: string, visible: boolean): boolean {
    const layer = this.layers.get(id);
    if (layer) {
      layer.show = visible;
      return true;
    }
    return false;
  }

  /**
   * 清除所有图层
   * 从场景中移除所有图层并清空图层映射表
   */
  public clearLayers(): void {
    this.layers.forEach((layer) => {
      this.viewer.imageryLayers.remove(layer);
    });
    this.layers.clear();
  }
}
